package com.ming.ui;

import javax.swing.*;
import javax.swing.border.BevelBorder;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.ArrayList;
import java.util.Random;

public class Game extends JFrame implements KeyListener, ActionListener {
    ArrayList<User> allUsers = new ArrayList<>();
    //创建二维数组
    //目的：用来管理数据
    int [][]data = new int[4][4];
    int x = 0;
    int y = 0;
    //x和y记录空白相册的位置
    //与游戏相关的内容写在此
    //定义图片的路径
    int SuiJi;
    String[] str = {"animal","girl","sport"};
    int SuiJi2;
    String path;
    //定义一个胜利的二维数组
    int [][]win = new int[][]{
            {1,2,3,4},
            {5,6,7,8},
            {9,10,11,12},
            {13,14,15,16}
    };


    //创建选项下的条目对象
    //功能
    JMenuItem replayItem = new JMenuItem("重新游戏");
    JMenuItem replace = new JMenuItem("更换图片");
    JMenuItem reLogItem = new JMenuItem("重新登陆");
    JMenuItem closeItem = new JMenuItem("关闭游戏");
    //关于我们
    JMenuItem accountItem = new JMenuItem("公众号");


    //定义一个记步器
    int step = 0;


        public  Game(){
            //初始化界面
            initJFrame();

            //初始化菜单
            initJMenuBar();
            SuiJi2 = new Random().nextInt(3);
            if(SuiJi2 == 0){
                SuiJi = new Random().nextInt(8) + 1;
                path = "image\\animal\\animal" + SuiJi + "\\";
            } else if (SuiJi2 == 1) {
                SuiJi = new Random().nextInt(13) + 1;
                path = "image\\girl\\girl" + SuiJi + "\\";
            } else if (SuiJi2 == 2) {
                SuiJi = new Random().nextInt(10) + 1;
                path = "C:\\Users\\Zdm\\IdeaProjects\\Main\\PuzzleGame\\image\\sport\\sport" + SuiJi + "\\";
            }

            //打乱数据
            initData();

            //初始化图片
            initImage();

            //显现画面，建议写在最后
            this.setVisible(true);

        }
        //初始化
        //需要根据二维数组管理的数据放置图片

        public void Count(){
            for (int i = 60; i >= 0; i--) {
                JLabel count = new JLabel("倒计时:" + i);
                count.setBounds(150,30,100,20);
                this.getContentPane().add(count);
                try {
                    Thread.sleep(1);
                } catch (InterruptedException e) {
                    throw new RuntimeException(e);
                }
            }


        }
        public void initImage(){
            //清空本来的图片
            this.getContentPane().removeAll();
            //判断是否胜利


            if(victory()){
                //显示胜利
                JLabel win = new JLabel(new ImageIcon("C:\\Users\\Zdm\\IdeaProjects\\Main\\PuzzleGame\\image\\win.png"));
                win.setBounds(203,283,197,73);

                this.getContentPane().add(win);
            }
            JLabel stepCount = new JLabel("狗的步数:" + step);
            stepCount.setBounds(50,30,100,20);
            this.getContentPane().add(stepCount);
            //倒计时
            //Count();


            //先加载的图片在上方
            for (int i = 0; i < 4; i++) {
                //外循环---重复执行四次
                for (int j = 0; j < 4; j++) {
                    int num = data[i][j];
                    //内循环---添加四张照片
                    //创建一个JLabel的对象(管理容器）
                    JLabel jLabel = new JLabel(new ImageIcon(path + num + ".jpg"));
                    //指定图片的位置
                    jLabel.setBounds(105 * j + 83,105 * i + 134,105,105);
                    jLabel.setBorder(new BevelBorder(BevelBorder.LOWERED));
                    //把管理容器添加到界面
                    //this.add(jLabel);
                    this.getContentPane().add(jLabel);
                    num++;
                }
            }
            //添加背景图
            ImageIcon imageIcon = new ImageIcon("C:\\Users\\Zdm\\IdeaProjects\\Main\\PuzzleGame\\image\\background.png");
            JLabel jLabel = new JLabel(imageIcon);
            jLabel.setBounds(40,40,508,560);
            this.getContentPane().add(jLabel);


            //刷新出新的界面
            this.getContentPane().repaint();
        }

        private void initJMenuBar() {
        //初始化菜单
        //创建整个的菜单对象
        JMenuBar jMenuBar = new JMenuBar();

        //创建菜单上的两个选项的对象("功能，关于我们")
        JMenu functionJMenu = new JMenu("功能");
        JMenu aboutJMenu = new JMenu("关于我们");

        
        //添加小选项
        functionJMenu.add(replayItem);
        functionJMenu.add(reLogItem);
        functionJMenu.add(replace);
        functionJMenu.add(closeItem);


        aboutJMenu.add(accountItem);

        //给条目绑定事件
            replayItem.addActionListener(this);
            reLogItem.addActionListener(this);
            replace.addActionListener(this);
            closeItem.addActionListener(this);



            accountItem.addActionListener(this);

        //菜单里的两个选项添加到菜单中
        jMenuBar.add(functionJMenu);
        jMenuBar.add(aboutJMenu);

        //给整个界面设置菜单
        this.setJMenuBar(jMenuBar);
    }

        private void initJFrame() {
        //游戏进行时的画面
        //设置画面的宽和高
        this.setSize(603,680);

        //设置界面的标题
        this.setTitle("拼图单机版 v1.0   张德明最帅");

        //设置界面始终置顶
        this.setAlwaysOnTop(true);

        //设置界面居中
        this.setLocationRelativeTo(null);

        //取消默认的居中方式
        this.setLayout(null);

        //设置关闭模式
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);

        //设置键盘监听功能
            this.addKeyListener(this);
    }
    /*public void Count(){
        String i = "倒计时：60";
        JLabel count = new JLabel(i);
        count.setBounds(90,30,100,20);
        this.getContentPane().add(count);
    }*/

        private void initData(){
            //初始化数据
            int []tempArr = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
            Random r = new Random();
            for(int i = 0; i < tempArr.length; i++){
                int index = r.nextInt(tempArr.length);
                int temp = tempArr[i];
                tempArr[i] = tempArr[index];
                tempArr[index] = temp;
            }
            for (int i = 0; i < tempArr.length; i++) {
                if(tempArr[i] == 0){
                    x = i / 4;
                    y = i % 4;
                }
                data[i/4][i%4] = tempArr[i];

            }
        }

    @Override
    public void keyTyped(KeyEvent e) {

    }

    @Override
    //按下不松的时候调用
    public void keyPressed(KeyEvent e) {
        int code = e.getKeyCode();
        if(code == 65){
            //将界面中的图片删除
            this.getContentPane().removeAll();
            //加载图片
            JLabel all = new JLabel(new ImageIcon(path + "all.jpg"));
            all.setBounds(83,134,420,420);
            this.getContentPane().add(all);
            //添加背景图
            ImageIcon imageIcon = new ImageIcon("C:\\Users\\Zdm\\IdeaProjects\\Main\\PuzzleGame\\image\\background.png");
            JLabel jLabel = new JLabel(imageIcon);
            jLabel.setBounds(40,40,508,560);
            this.getContentPane().add(jLabel);
            //刷新界面
            this.getContentPane().repaint();
            
            
        }
    }

    @Override
    public void keyReleased(KeyEvent e) {
            //判断是否胜利
        if(victory()){
            return;
            //直接结束游戏，不再调用下列函数
        }

        int code = e.getKeyCode();
        //左：37，上：38，右：39，下：40
        if(code == 37){
            if(y == 3){
                return;
            }
            System.out.println("向左移动");
            data[x][y] = data[x][y+1];
            data[x][y+1] = 0;
            y++;
            //每移动一次，计数器自增一次
            step++;
            initImage();
        }
        else if (code == 38) {
            if(x == 3){
                return;
            }
            System.out.println("向上移动");
            //逻辑：
            //空白下方的上移
            //x,y表示空白方块
            //x+1，y表示下方方块
            data[x][y] = data[x+1][y];
            data[x+1][y] = 0;
            x++;
            //每移动一次，计数器自增一次
            step++;
            //加载出改变后的图片
            initImage();
        }
        else if (code == 39) {
            if(y == 0){
                return;
            }
            System.out.println("向右移动");
            data[x][y] = data[x][y-1];
            data[x][y-1] = 0;
            y--;
            //每移动一次，计数器自增一次
            step++;
            initImage();
        }
        else if (code == 40) {
            if(x == 0){
                return;
            }
            System.out.println("向下移动");
            //逻辑：
            //空白下方的上移
            //x,y表示空白方块
            //x+1，y表示下方方块
            data[x][y] = data[x-1][y];
            data[x-1][y] = 0;
            x--;
            //每移动一次，计数器自增一次
            step++;
            //加载出改变后的图片
            initImage();
        } else if (code == 65) {
            initImage();
        } else if (code == 81) {
            data = new int[][]{
                    {1,2,3,4},
                    {5,6,7,8},
                    {9,10,11,12},
                    {13,14,15,16}
            };
            showJDialog("开挂是吧老弟");
            showJDialog("下次别让我逮到了");
            showJDialog("逮到了就是一顿揍");
            initImage();
        }
    }
    public boolean victory(){
        for (int i = 0; i < data.length; i++) {
            //i表示二维数组中的data里面的索引
            //data[i]：表示每一个一维数组
            for (int i1 = 0; i1 < data[i].length; i1++) {
                if(data[i][i1] != win[i][i1]){
                    //只要有一个不一样，就返回false
                    return false;
                }
            }

        }

        //待所有的比完后，全部相等返回true
        return true;
    }
    public void showJDialog(String content){
        //创建一个弹窗对象
        JDialog jDialog = new JDialog();
        //设置大小
        jDialog.setSize(200,150);
        //弹框置顶
        jDialog.setAlwaysOnTop(true);
        //居中
        jDialog.setLocationRelativeTo(null);
        //不关闭无法进行其他的操作
        jDialog.setModal(true);

        //创建JLabel对象
        JLabel warning = new JLabel(content);
        warning.setBounds(0,0,200,150);
        jDialog.getContentPane().add(warning);

        //展示
        jDialog.setVisible(true);
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        Object obj = e.getSource();
        if(obj == replayItem){
            System.out.println("重新游戏");
            //再次打乱二维数组
            initData();
            //重置步数
            step = 0;
            //重新加载图片
            initImage();



        }else if (obj == reLogItem) {

            //返回登录界面

            //关闭当前游戏界面
            this.setVisible(false);
            //打开登录界面
            new Log(allUsers);

            System.out.println("重新登陆");


        }else if (obj == closeItem) {


            System.out.println("关闭游戏");
            System.exit(0);



        }else if (obj == accountItem) {
            JDialog jDialog = new JDialog();
            //管理图片的容器
            JLabel jLabel = new JLabel(new ImageIcon("C:\\Users\\Zdm\\IdeaProjects\\Main\\PuzzleGame\\image\\IMG_20231007_154651(1).png"));
            //设置位置和宽高
            jLabel.setBounds(0,0,258,258);
            //设置弹框加入
            jDialog.getContentPane().add(jLabel);
            //弹框设置大小
            jDialog.setSize(344,344);
            //设置弹框置顶
            jDialog.setAlwaysOnTop(true);
            //设置弹框居中
            jDialog.setLocationRelativeTo(null);
            //设置弹框不关闭则无法进行操作
            jDialog.setModal(true);
            //让弹框显示
            jDialog.setVisible(true);





            System.out.println("公众号");


        } else if (e.getSource() == replace) {
            System.out.println("更换图片");
            SuiJi2 = new Random().nextInt(3);
            if(SuiJi2 == 0){
                SuiJi = new Random().nextInt(8) + 1;
                path = "C:\\Users\\Zdm\\IdeaProjects\\Main\\PuzzleGame\\image\\animal\\animal" + SuiJi + "\\";
            } else if (SuiJi2 == 1) {
                SuiJi = new Random().nextInt(13) + 1;
                path = "C:\\Users\\Zdm\\IdeaProjects\\Main\\PuzzleGame\\image\\girl\\girl" + SuiJi + "\\";
            } else if (SuiJi2 == 2) {
                SuiJi = new Random().nextInt(10) + 1;
                path = "C:\\Users\\Zdm\\IdeaProjects\\Main\\PuzzleGame\\image\\sport\\sport" + SuiJi + "\\";
            }
            initData();
            step = 0;
            initImage();
        }
    }
}
